home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_300
/
331_01
/
ged7.c
< prev
next >
Wrap
Text File
|
1990-06-12
|
8KB
|
338 lines
/*
HEADER: CUG199.07;
TITLE: GED (nee QED) screen editor -- part 7;
DATE: 12/17/86;
DESCRIPTION: "Low level terminal i/o functions for the GED editor.
Putch, getch, etc.";
KEYWORDS: putch, getch;
SYSTEM: MS-DOS;
FILENAME: GED7.C;
AUTHORS: G. Nigel Gilbert, James W. Haefner, Mel Tearle, G. Osborn;
COMPILERS: DeSmet C;
*/
/* e/qed/ged screen editor
(C) G. Nigel Gilbert, MICROLOGY, 1981
August-December 1981
Modified: Aug-Dec 1984: BDS-C 'e'(vers 4.6a) to 'qe' (J.W. Haefner)
March 1985: BDS-C 'qe' to DeSmet-C 'qed' (J.W. Haefner)
May 1986: converted to ged - Mel Tearle
FILE: ged7.c
FUNCTIONS: getkey, testkey, getlow, testlow, getscankey,
inkey, putret, dispch, putch, chkbuf, gettime,
inword, uspr, beep, dohelp
PURPOSE: low level terminal i/o functions and additions
*/
#include <ctype.h> /* for Microsoft only */
#include "ged.h"
char timestr[9],prevstr[9];
/* wait for a key to be pressed & return it,
* translating to internal codes
*/
unsigned char getkey()
{
unsigned char testkey();
unsigned char c;
while ( !(c = testkey()) )
;
return c;
}
/* if a key has been pressed, return it, else 0
* see pcio.a for mods to scr_ci
*/
unsigned char testkey()
{
unsigned char inkey();
unsigned char c, *tranp;
int i;
if ( c = inkey() ) {
if ( c == *(tranp = tran) ) {
while ( !( c = inkey()) )
;
c |= PARBIT;
}
for ( i = 1, tranp++; i < NKEYS; i++, tranp++ ) {
if ( c == *tranp )
return i;
}
if (c >= ' ')
return c;
else
return 0;
}
else {
show_time(0);
return 0;
}
}
/* get a key, converting control and u/c keys to l/c,
* translation of ESCKEY only
*/
unsigned char getlow()
{
unsigned char c;
unsigned char testlow();
while ( !(c = testlow()) );
return c;
}
/* test for a key, convert upper
* and control chars to lower case
*/
unsigned char testlow()
{
unsigned char inkey();
unsigned char c;
if ( !( c = inkey() ) ) return 0;
if ( tran[ESCKEY] == c ) return ESCKEY;
if ( c >= F1KEY && c <= F10KEY ) return c;
if ( c < ' ') c = c + 96;
return ( c >= 'A' && c <= 'Z' ? c + 32 : c );
}
/* get a key, translation of ESCKEY, CR, LEFTKEY,
* DELLEFT, RETRIEVE only
*/
unsigned char getscankey()
{
unsigned char inkey();
unsigned char c;
while ( !( c = inkey()) );
if (tran[ESCKEY] == c) return ESCKEY_P;
if (tran[CR] == c) return CR_P;
if (tran[LEFTKEY] == c) return LEFTKEY_P;
if (tran[DELLEFT] == c) return DELLEFT_P;
if (tran[RETRIEVE] == c) return RETRIEVE_P;
return c;
}
/* Dequeues and returns the next input character. chkbuf() can be called
* from anywhere to keep the input buffer current. This buffer is
* redundant with the BIOS input buffer, but is used to detect excessive
* backlog. Returns 0 if no key. Never waits.
*/
unsigned char inkey()
{
unsigned char c;
int i;
if (chkbuf()) {
c = inbuf[0];
inbufp--;
for (i = 0; i < inbufp; i++)
inbuf[i] = inbuf[i+1];
return c;
}
else {
return 0;
}
}
/* Returns the next input character but leaves the character in the queue.
* Allows a look-ahead capability without the commitment of processing
* the next command. Returns 0 if no key. Never waits.
*/
unsigned char peekkey()
{
if (chkbuf())
return inbuf[0];
else
return 0;
}
/* Dequeue and return last key pressed.
/* type a CR/LF
*/
putret()
{
putch('\r');
putch('\n');
}
/* type a character, in different intensity
* if non-printable turned off - mt.
*/
dispch(c)
char c;
{
if ( c < ' ' ) {
/* makeother(); */
/* _os( DIRIO, c+64 ); */
/* makeother(); */
}
else
scr_co(c);
}
/* type a character to crt test for keyboard input
*/
putch(c)
char c;
{
char cc;
scr_co(c);
chkbuf();
}
/*
* Returns 0 if buffer is empty; otherwise returns the backlogged character
* count. First inputs and queues character if any.
* show_time not used here only because it might slow some operations.
*/
int chkbuf()
{
char cc;
if ( ( cc = scr_csts() ) != 0 && inbufp < BUFFER )
inbuf[inbufp++] = cc;
return inbufp;
}
int gettime()
{
unsigned hours, mins, secs;
rax = 0x2C00;
syscall();
mins = rcx & 0x00ff;
hours = rcx >> 8;
secs = (rdx >> 8) & 0x00ff;
sprintf( timestr, "%02d:%02d:%02d", hours, mins, secs );
return secs;
}
/* refresh time field in status line if time has changed (change==0),
* or unconditionally (change==1) */
show_time(change)
int change;
{
int sav; /* this variable must not be global */
gettime();
if (blankedmess || change || strcmp( timestr, prevstr ) != 0 ) {
strcpy( prevstr, timestr );
sav = curson(NO);
scr_aputs( TIMEPOS, 0, timestr, ATTR3 );
gotoxy(cursorx-offset,cursory);
curson(sav);
}
return;
}
/* return true if c is a letter, digit or punctuation
* not very elegant but lots of control, used to delete a word
*/
/* DeSmet version
* inword(c)
* char c;
* {
* return isalnum(c) || index( "\"\\!@#$%^&*()_+-[]{};'`:~,./<>?|", c );
* }
*/
/* Microsoft version */
inword(c)
char c;
{
char *strchr();
/* return isalnum(c) || *strchr( "\"\\!@#$%^&*()_+-[]{};'`:~,./<>?|", c );*/
return isalnum(c) || *strchr( "\"\\!@#$%^&*()_+-[]{};'`:~./<>?|", c );
}
/* print 'n' as a number, return number of chars typed
* useful in debugging
*/
int uspr(sn,ln,attri)
unsigned int sn,attri;
long int ln;
{
int temp;
long n;
n = 0;
if ( !ln )
n = sn;
else
n = ln;
if ( n < 10 ) {
scr_putch( ( unsigned char )(n+'0'), attri );
return 1;
}
temp = uspr( 0, n/10, attri );
uspr( 0, n%10, attri );
return temp+1;
}
/* display help menu
*/
dohelp()
{
int y;
puttext();
topline = 11;
calp();
cleareop(1);
gotoxy(0,1);
/* display the help menu
*/
putstr("LEFT: char <--, ^S word ^A line ^<--, ^U\n");
putstr("RGHT: char -->, ^D word ^F line ^-->, ^]\n");
putstr("UP: window ^W line ^E page ^R, <PgUp> file <Home>\n");
putstr("DOWN: window ^Z line ^X page ^C, <PgDn> file <End>\n");
putstr("DELETE: char ^G, <Del>, <BS>; word ^T, line ^Y, block ^K, rpl ^V, <ins>\n");
putstr("undo ^- push line ^Y pop ^P copypop ^O linejump ^J\n");
putstr("Search/rpl: F3 up agn, F4 dn agn, ^L agn, ^QF,F2 new search, ^QA replace\n");
putstr("<esc> cancel, ^K block/output/read, ^Q find/rpl/files/paragraph\n");
putstr("F1 help on/off F6 cent. window. F7 opts, F8 dir, F9 bye, F10 save\n");
putstr("-------------------------------------------------------------------------------\n");
putpage();
return;
}